import math
import sls_ngc_orginDialog
# 判断坐标是否在中国范围内
def out_of_china(lng, lat):
    return not (72.004 <= lng <= 137.8347 and 0.8293 <= lat <= 55.8271)

# 转换算法辅助函数
def transformlat(x, y):
    ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * math.sqrt(abs(x))
    ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
    ret += (20.0 * math.sin(y * math.pi) + 40.0 * math.sin(y / 3.0 * math.pi)) * 2.0 / 3.0
    ret += (160.0 * math.sin(y / 12.0 * math.pi) + 320 * math.sin(y * math.pi / 30.0)) * 2.0 / 3.0
    return ret

# 转换算法辅助函数
def transformlng(x, y):
    ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * math.sqrt(abs(x))
    ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0
    ret += (20.0 * math.sin(x * math.pi) + 40.0 * math.sin(x / 3.0 * math.pi)) * 2.0 / 3.0
    ret += (150.0 * math.sin(x / 12.0 * math.pi) + 300.0 * math.sin(x / 30.0 * math.pi)) * 2.0 / 3.0
    return ret

# WGS - 84 转 GCJ - 02
def wgs84_to_gcj02(lng, lat):
    if out_of_china(lng, lat):
        return [lng, lat]
    dlat = transformlat(lng - 105.0, lat - 35.0)
    dlng = transformlng(lng - 105.0, lat - 35.0)
    radlat = lat / 180.0 * math.pi
    magic = math.sin(radlat)
    magic = 1 - 0.00669342162296594323 * magic * magic
    sqrtmagic = math.sqrt(magic)
    dlat = (dlat * 180.0) / ((6378245.0 * (1 - 0.00669342162296594323)) / (magic * sqrtmagic) * math.pi)
    dlng = (dlng * 180.0) / (6378245.0 / sqrtmagic * math.cos(radlat) * math.pi)
    mglat = lat + dlat
    mglng = lng + dlng
    return [mglng, mglat]

# GCJ - 02 转 WGS - 84
def gcj02_to_wgs84(lng, lat):
    if out_of_china(lng, lat):
        return [lng, lat]
    dlat = transformlat(lng - 105.0, lat - 35.0)
    dlng = transformlng(lng - 105.0, lat - 35.0)
    radlat = lat / 180.0 * math.pi
    magic = math.sin(radlat)
    magic = 1 - 0.00669342162296594323 * magic * magic
    sqrtmagic = math.sqrt(magic)
    dlat = (dlat * 180.0) / ((6378245.0 * (1 - 0.00669342162296594323)) / (magic * sqrtmagic) * math.pi)
    dlng = (dlng * 180.0) / (6378245.0 / sqrtmagic * math.cos(radlat) * math.pi)
    mglat = lat + dlat
    mglng = lng + dlng
    # print(sls_ngc_orginDialog.GPSRectifyDialog.dlat,sls_ngc_orginDialog.GPSRectifyDialog.dlon)
    return [lng - (mglng - lng)-sls_ngc_orginDialog.GPSRectifyDialog.dlat, lat - (mglat - lat)-sls_ngc_orginDialog.GPSRectifyDialog.dlon]

if __name__ == '__main__':
    # 测试
    wgs84_lng = 116.397428  # 经度
    wgs84_lat = 39.90923  # 纬度
    gcj02_lng, gcj02_lat = wgs84_to_gcj02(wgs84_lng, wgs84_lat)  # 转换为 GCJ - 02
    wgs84_lng2, wgs84_lat2 = gcj02_to_wgs84(gcj02_lng, gcj02_lat)  # 转换回 WGS - 84
    print(f"WGS - 84: {wgs84_lng}, {wgs84_lat}")    # 输出原始 WGS - 84 坐标
    print(f"GCJ - 02: {gcj02_lng}, {gcj02_lat}")  # 输出转换后的 GCJ - 02 坐标  
    print(f"WGS - 84: {wgs84_lng2}, {wgs84_lat2}")  # 输出转换回的 WGS - 84 坐标
    

    #反过来再测试
    gcj02_lng = 116.397428  # 经度
    gcj02_lat = 39.90923  # 纬度        
    wgs84_lng, wgs84_lat = gcj02_to_wgs84(gcj02_lng, gcj02_lat)  # 转换为 GCJ - 02
    gcj02_lng2, gcj02_lat2 = wgs84_to_gcj02(wgs84_lng, wgs84_lat)  # 转换回 WGS - 84
    print(f"GCJ - 02: {gcj02_lng}, {gcj02_lat}")    # 输出原始 WGS - 84 坐标
    print(f"WGS - 84: {wgs84_lng}, {wgs84_lat}")  # 输出转换后的 GCJ - 02 坐标
    print(f"GCJ - 02: {gcj02_lng2}, {gcj02_lat2}")  # 输出转换回的 WGS - 84 坐标
    #计算两点距离
    def get_distance(lat1, lng1, lat2, lng2):
        # 计算两点间的距离
        earth_radius = 6371.0  # 地球半径，单位为千米
        lat1_rad = math.radians(lat1)
        lng1_rad = math.radians(lng1)  # 经度
        lat2_rad = math.radians(lat2)
        lng2_rad = math.radians(lng2)  # 经度
        dlat = lat2_rad - lat1_rad
        dlng = lng2_rad - lng1_rad  # 经度          
        a = math.sin(dlat / 2) ** 2 + math.cos(lat1_rad) * math.cos(lat2_rad) * math.sin(dlng / 2) ** 2
        c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
        distance = earth_radius * c  # 距离，单位为千米
        return distance 
    #计算两点距离
    distance = get_distance(wgs84_lat, wgs84_lng, wgs84_lat2, wgs84_lng2)
    distance2 = get_distance(gcj02_lat, gcj02_lng, gcj02_lat2, gcj02_lng2)
    print(f"两点距离: {distance2} 千米")
    print(f"两点距离: {distance} 千米")
